package ClassesAndObjects;


//局部变量必须初始化才能使用
public class TestDate {
    //局部变量必须初始化后才能被使用,为什么字段声明后没有初始化依旧可以使用呢？->对象中的成员变量如何初始化?--构造方法
    //如果在下面不赋值，在这赋值会使所以的实例化对象都变成所赋的值
    public int year = 1998;
    public int month = 2;
    public int day = 12;

    //普通方法由：返回值 方法名 （参数列表） {方法体} 组成
    //构造方法由：方法名 （参数列表）{方法体} 组成 ；特点：没有返回值的方法，并且方法名必须和类名保持一致
    //构造方法可以有多个（意味着构造方法可以重载！！），访问权限可加可不加
    //当我们没有写任何构造方法时，编译器会默认帮我们生成一个不带任何参数的构造方法（所以我们之前没写的时候也不会报错）
    TestDate() {
        System.out.println("没有参数的构造方法！");
    }

    TestDate(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day = day;

        System.out.println("有3个参数的构造方法！");
    }

    //自动生成构造方法：代码行右键->Generate->Constructor->然后选择你要创建构造方法的参数
    //构造方法在构造对象的同时，也可以帮我们进行对象的初始化（对象成员的初始化）

//    public void setDate(int y,int m,int d) {
//        year = y;
//        month = m;
//        day = d;
//    }

    public void setDate(int year,int month,int day) {
        //不加this.全部为0
        //谁调用的setDate这个this就是谁

        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void printDate() {
        System.out.println("年：" + year + " 月：" + month + " 日：" + day);
    }


    public static void main(String[] args) {
          //局部变量必须初始化后才能被使用
          //int a;
          //System.out.println(a);
        //一个对象的产生至少由2个步骤：1.为对象分配内存；2.调用合适的构造方法
        TestDate testDate1 = new TestDate(); //没有参数的构造方法会在这被调用
        TestDate testDate2 = new TestDate(2001,12,30); //调用我们自己写的带三个参数的构造方法
        TestDate testDate3 = new TestDate();

        testDate1.setDate(2000,10,29);
        //testDate2.setDate(2001,11,30);
        //testDate3.setDate(2002,12,31);

        testDate1.printDate();
        testDate2.printDate();
        testDate3.printDate();
    }
}
